/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package sistema.clinica.riobamba.desktop;

import Accesodatos.Conexion;
import Arduino.UtilArduino;
import Clases.Paciente;
import Funciones.FuncionesPaciente;
import java.io.InputStream;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.fxml.JavaFXBuilderFactory;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;

/**
 *
 * @author xavier
 */
public class SistemaClinicaRiobambaDesktop extends Application {

    ServicioOnlineController serviciosOnline;
    LoginController login;
    private Stage stage;
    private Paciente loggedUser;
    private static String mensajeError = "";
    public UtilArduino arduino = new UtilArduino();

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

    public Paciente getLoggedUser() {
        return loggedUser;
    }

    public static String getMensajeError() {
        return mensajeError;
    }

    public static void setMensajeError(String mensajeError) {
        SistemaClinicaRiobambaDesktop.mensajeError = mensajeError;
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        stage = primaryStage;
        stage.setTitle("Sistema Clinica Riobamba");
        stage.centerOnScreen();
        //stage.initStyle(StageStyle.UNDECORATED);
        //gotoLogin();
        gotoServiciosOnline();
        primaryStage.show();
        stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
            @Override
            public void handle(WindowEvent t) {
                if (login != null ? !login.errorMessage.getText().equals("") : false || serviciosOnline != null) {
                    try {
                        Conexion.getInstance().desconectar();
                        System.out.println("se cerro sesion de BD");
                    } catch (Exception ex) {
                        System.out.println("error al cerrar la sesion de la db");
                    }
                }
                if (serviciosOnline != null) {
                    if (serviciosOnline.getSerialPort() != null) {
                        serviciosOnline.getSerialPort().removeEventListener();
                        serviciosOnline.getSerialPort().close();
                        serviciosOnline.setInput(null);
                        System.out.println("cerrando puerto");
                    }
                    if (loggedUser != null) {
                        loggedUser.setEstado(false);
                        FuncionesPaciente.modificarEstado(loggedUser);
                        loggedUser = null;
                        System.out.println("seteando estado a false");
                    }
                    System.out.println("salio de SO");
                } else {
                    System.out.println("salio de login");
                }
            }
        });
    }

    public boolean userLogging(String cedula, String contrasena) {
        Paciente p = new Paciente();
        p.setCi(cedula);
        p.setContrasena(contrasena);
        p = FuncionesPaciente.login(p);
        if (p != null) {
            loggedUser = p;
            loggedUser.setEstado(true);
            FuncionesPaciente.modificarEstado(loggedUser);
            //setear estado
            gotoServiciosOnline();
            return true;
        } else {
            return false;
        }
    }

    void userLogout() {
        if (serviciosOnline.getSerialPort() != null) {
            serviciosOnline.getSerialPort().removeEventListener();
            serviciosOnline.getSerialPort().close();
            serviciosOnline.setInput(null);
            System.out.println("cerrando puerto");
        }
        if (loggedUser != null) {
            loggedUser.setEstado(false);
            FuncionesPaciente.modificarEstado(loggedUser);
            loggedUser = null;
            System.out.println("seteando estado a false");
        }
        gotoLogin();
    }

    private void gotoLogin() {
        try {
            login = (LoginController) replaceSceneContent("Login.fxml");
            stage.centerOnScreen();
            login.setApp(this);
        } catch (Exception ex) {

        }
    }

    private void gotoServiciosOnline() {
        try {
            serviciosOnline = (ServicioOnlineController) replaceSceneContent("ServicioOnline.fxml");
            stage.centerOnScreen();
            serviciosOnline.setApp(this);
            if (loggedUser != null) {
                serviciosOnline.lblUser.setText(loggedUser.getNombres() + " " + loggedUser.getApellidos());
                serviciosOnline.getSv().setId_paciente(loggedUser.getId_p());
            }
            //this.arduino.setSoController(serviciosOnline);
            //activarArduino();
        } catch (Exception ex) {

        }
    }

    private Initializable replaceSceneContent(String fxml) throws Exception {
        FXMLLoader loader = new FXMLLoader();
        InputStream in = SistemaClinicaRiobambaDesktop.class.getResourceAsStream(fxml);
        loader.setBuilderFactory(new JavaFXBuilderFactory());
        loader.setLocation(SistemaClinicaRiobambaDesktop.class.getResource(fxml));
        AnchorPane page;
        try {
            page = (AnchorPane) loader.load(in);
        } finally {
            in.close();
        }
        Scene scene = new Scene(page);//new Scene(page, 800, 600);
        stage.setScene(scene);
        stage.sizeToScene();
        return (Initializable) loader.getController();
    }

}
